Speed this function up, using the fact that visibility is constant across
authorMatthias Clasen <mclasen@redhat.com>
Mon, 12 Dec 2005 19:33:23 +0000 (19:33 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 12 Dec 2005 19:33:23 +0000 (19:33 +0000)
2005-12-12  Matthias Clasen  <mclasen@redhat.com>

* gtk/gtktextiter.c (gtk_text_iter_set_visible_line_index):
Speed this function up, using the fact that visibility is
constant across segments. (#321548, Paolo Borelli)

ChangeLog
ChangeLog.pre-2-10
gtk/gtktextiter.c

index dafd4a9acf993353b070f88312f19a27a22dcb92..c0061b19e7995c830b7a40038e1365e6807b4b4c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,13 @@
 2005-12-12  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktextiter.c (gtk_text_iter_set_visible_line_index): 
+       Speed this function up, using the fact that visibility is 
+       constant across segments. (#321548, Paolo Borelli)
+
        * gtk/gtktextbtree.c (_gtk_text_line_char_to_byte_offsets): 
        * gtk/gtktextiter.c (gtk_text_iter_backward_chars): Speed up
        stepping backwards.  (#320638, Larry Ewing, Paolo Borelli)
-       
+
        * gtk/gtkicontheme.c (ensure_valid_themes): Only broadcast
        _GTK_LOAD_ICONTHEMES if we detect a real theme change, not
        upon initial theme load.  (#323876, Peter Lund)
index dafd4a9acf993353b070f88312f19a27a22dcb92..c0061b19e7995c830b7a40038e1365e6807b4b4c 100644 (file)
@@ -1,9 +1,13 @@
 2005-12-12  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktextiter.c (gtk_text_iter_set_visible_line_index): 
+       Speed this function up, using the fact that visibility is 
+       constant across segments. (#321548, Paolo Borelli)
+
        * gtk/gtktextbtree.c (_gtk_text_line_char_to_byte_offsets): 
        * gtk/gtktextiter.c (gtk_text_iter_backward_chars): Speed up
        stepping backwards.  (#320638, Larry Ewing, Paolo Borelli)
-       
+
        * gtk/gtkicontheme.c (ensure_valid_themes): Only broadcast
        _GTK_LOAD_ICONTHEMES if we detect a real theme change, not
        upon initial theme load.  (#323876, Peter Lund)
index a2c099bfcf4d1d44b62ce97e8c87537310b08cf6..c919f386dcbf42d894df8638c0e7937345c94124 100644 (file)
@@ -3890,12 +3890,6 @@ gtk_text_iter_set_visible_line_offset (GtkTextIter *iter,
     gtk_text_iter_forward_line (iter);
 }
 
-static gint
-bytes_in_char (GtkTextIter *iter)
-{
-  return g_unichar_to_utf8 (gtk_text_iter_get_char (iter), NULL);
-}
-
 /**
  * gtk_text_iter_set_visible_line_index:
  * @iter: a #GtkTextIter
@@ -3906,40 +3900,54 @@ bytes_in_char (GtkTextIter *iter)
  * in the index.
  **/
 void
-gtk_text_iter_set_visible_line_index  (GtkTextIter *iter,
-                                       gint         byte_on_line)
+gtk_text_iter_set_visible_line_index (GtkTextIter *iter,
+                                      gint         byte_on_line)
 {
-  gint bytes_seen = 0;
-  gint skipped = 0;
+  GtkTextRealIter *real;
+  gint bytes_in_line = 0;
+  gint offset = 0;
   GtkTextIter pos;
-
-  g_return_if_fail (iter != NULL);
+  GtkTextLineSegment *seg;
   
+  g_return_if_fail (iter != NULL);
+
   gtk_text_iter_set_line_offset (iter, 0);
 
+  bytes_in_line = gtk_text_iter_get_bytes_in_line (iter);
+
   pos = *iter;
 
-  /* For now we use a ludicrously slow implementation */
-  while (bytes_seen < byte_on_line)
+  real = gtk_text_iter_make_real (&pos);
+
+  if (real == NULL)
+    return;
+
+  ensure_byte_offsets (real);
+
+  check_invariants (&pos);
+
+  seg = _gtk_text_iter_get_indexable_segment (&pos);
+
+  while (seg != NULL && byte_on_line > 0)
     {
       if (!_gtk_text_btree_char_is_invisible (&pos))
-        bytes_seen += bytes_in_char (&pos);
-      else skipped++;
-
-      if (!gtk_text_iter_forward_char (&pos))
-        break;
+        {
+          if (byte_on_line < seg->byte_count)
+            {
+              iter_set_from_byte_offset (real, real->line, offset + byte_on_line);
+              byte_on_line = 0;
+              break;
+            }
+          else
+            byte_on_line -= seg->byte_count;
+        }
 
-      if (bytes_seen >= byte_on_line)
-        break;
+      offset += seg->byte_count;
+      _gtk_text_iter_forward_indexable_segment (&pos);
+      seg = _gtk_text_iter_get_indexable_segment (&pos);
     }
 
-  if (bytes_seen > byte_on_line)
-    g_warning ("%s: Incorrect visible byte index %d falls in the middle of a UTF-8 "
-               "character; this will crash the text buffer. "
-               "Byte indexes must refer to the start of a character.",
-               G_STRLOC, byte_on_line);
-  
-  if (_gtk_text_iter_get_text_line (&pos) == _gtk_text_iter_get_text_line (iter))
+  if (byte_on_line == 0)
     *iter = pos;
   else
     gtk_text_iter_forward_line (iter);